# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response, render
from django.views.decorators.cache import never_cache
import csv
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from calc.models import tipo, item, projeto
from django.views.decorators.csrf import csrf_exempt
from calc.forms import FormServer, FormTipo, FormProjeto
from django.template import RequestContext, Context


def calctotal(request, lista):
    
    contexto = Context()
    CustoMensalTotal = 0.0
    TotalDiscos = 0
    TotalInterfaces = 0
    TotalEquipamentos = 0.0
    CustoAnualTotal = 0.0
    QuantidadeTotal = 0
    CubagemTotal = 0.0
    ConsumoTotal = 0
    MemoriaTotal= 0
    
    listadeitem = lista
    for i in listadeitem:
            TotalInterfaces = TotalInterfaces + ( int(i.numinterfaces) * int(i.quantidade))
            CustoMensalTotal = CustoMensalTotal + i.getcustomensal()
            CustoAnualTotal =  CustoAnualTotal + i.getcustoanual() 
            QuantidadeTotal = int(QuantidadeTotal) + int(i.quantidade)
            CubagemTotal = CubagemTotal + (float(i.tipoitem.altura) * float(i.quantidade))
            ConsumoTotal = ConsumoTotal + ( int(i.tipoitem.consumo) * int(i.quantidade) ) 
            TotalEquipamentos = TotalEquipamentos + ( float(i.valor) * int(i.quantidade) ) 
            MemoriaTotal = MemoriaTotal + ( int(i.quantidade) * int(i.qtdmemory) )
            TotalDiscos = TotalDiscos + (int(i.quantidade) * int(i.qtddiscos))
    
    
    
    contexto['TotalDiscos'] = TotalDiscos
    contexto['CustoMensalTotal'] = CustoMensalTotal
    contexto['TotalEquipamentos'] = TotalEquipamentos
    contexto['CustoAnualTotal'] = CustoAnualTotal
    contexto['QuantidadeTotal'] =  QuantidadeTotal
    contexto['CubagemTotal'] =  CubagemTotal
    contexto['ConsumoTotal'] =  ConsumoTotal
    contexto['MemoriaTotal'] =  MemoriaTotal
    contexto['TotalInterfaces'] = TotalInterfaces
    
    return contexto
 
def inserir_item_lista(request):
    
    formprojeto = FormProjeto()
    formulario = FormServer(request.POST, request.FILES)
    listadeitem = []
    
    if 'lista' in request.session:
        listadeitem = request.session['lista']
        
        
    if formulario.is_valid():
                
        m = formulario.data['tipoitem']
        v = formulario.data['valor']
        memory = formulario.data['qtdmemory']
        qtddisco = formulario.data['qtddiscos']
        discos = formulario.data['disco']
        q = formulario.data['quantidade']
        i = formulario.data['numinterfaces']
        p = formulario.data['pool']
        c = formulario.data['componente']
        if not q:
            q = 0
        if not memory:
            memory = 0
        if not qtddisco:
            qtddisco = 0
       
        
        tamanhodalista = len(item.objects.all())
        contador = 0
        contador = contador + tamanhodalista
        mitem= tipo.objects.get(id= int(m))
        novoitem = item(tipoitem = mitem, valor = float(v), quantidade = q, numinterfaces = i, id = contador, qtdmemory = memory, disco= discos, qtddiscos = qtddisco, componente = c, pool = p)
        listadeitem.append(novoitem)
        request.session['lista'] = listadeitem
        
            
    contexto = calctotal(request, listadeitem)
    contexto['formulario'] = formulario
    contexto['formprojeto'] = formprojeto
    contexto['itens'] = listadeitem
           
    return  contexto
@never_cache    
@csrf_exempt
def index(request):
    
    listadeitem = []
    contexto = Context() 
    formulario = FormServer()
    if 'lista' in request.session:
        listadeitem = request.session['lista']
        contexto = Context()
        contexto = calctotal(request, listadeitem)
        contexto['itens'] = listadeitem
    
    contexto['formprojeto'] = FormProjeto()
    contexto['formulario'] = formulario
    
    if request.POST:
        formulario = FormServer(request.POST, request.FILES)
        contexto['formulario'] = formulario
        if formulario.is_valid():
            
            contexto = Context()
            contexto = inserir_item_lista(request)
            return HttpResponseRedirect("/")
        
        

    return render(request,"index.html", contexto)



def getprojetos(request):
    contexto = Context()
    if 'searchp' in request.GET:
        search = request.GET["searchp"]
        projetos = projeto.objects.filter(nome__startswith=search.lower()).order_by("nome")[:10]
    else:
        projetos = projeto.objects.all().order_by("nome")[:10]
    contexto['projetos'] = projetos
    return contexto

@never_cache
@csrf_exempt
def projetos(request):
    
    updateprojeto()
    
    
    contexto = getprojetos(request)
    formprojeto = FormProjeto()
    contexto['formprojeto'] = formprojeto
    
    if request.method == "POST":  
        formprojeto = FormProjeto(request.POST, request.FILES)
        contexto['formprojeto'] = formprojeto
        if formprojeto.is_valid():
            contexto = saveproject(request)
            return HttpResponseRedirect("/projetos")
        
        
        
        
    else:
        
        if request.GET:
            
            return render_to_response('tplbody.html', contexto, context_instance=RequestContext(request))

        
        
        
                    
    return render_to_response('projetos.html', contexto)
   
def updateprojeto():
    projetos = projeto.objects.all()
    
    for p in projetos:
        idprojeto = p.id
        p = projeto(p)
        projeto.objects.filter(id = idprojeto).update(customensal = p.getcustomensalprojeto(), custoanual = p.getcustoanualprojeto(), custoimplantacao = p.getcustoequipamentos())
    

@csrf_exempt
def saveproject(request):
    
    
        contexto = Context()
        formprojeto = FormProjeto(request.POST, request.FILES)
        projetos = projeto.objects.all()    
        contexto['projetos'] = projetos
        if formprojeto.is_valid():
            
            projectname = formprojeto.data["nome"]
        
            projectname = projectname.lower()
     
            p = projeto(nome = projectname, customensal = 0.0, custoimplantacao = 0.0, custoanual = 0.0)
            p.save()
            projetos = projeto.objects.order_by("nome")[:10]
            
            contexto['projetos'] = projetos
            
            updateprojeto()
            
            if 'lista' in request.session:  
                serverlist = request.session['lista']
        
                for i in serverlist:
                    s = item(itemprojeto = p, tipoitem = i.tipoitem, valor = i.valor, quantidade = i.quantidade, numinterfaces = i.numinterfaces, qtdmemory = i.qtdmemory, disco = i.disco, qtddiscos = i.qtddiscos, qtdprocessor = i.qtdprocessor, modelprocessor = i.modelprocessor, componente = i.componente, pool = i.pool )
                    s.save()
            
                del request.session['lista']

        
        
        
        
        
        
                
        
    
    
        
    
                return contexto
      
@csrf_exempt
def inserir_item_proj(request):
    
    
    
    formulario = FormServer(request.POST, request.FILES)
    idprojeto = request.GET['id']
    meuprojeto = projeto.objects.get(id = idprojeto)
    
    
                
    m = formulario.data['tipoitem']
    v = formulario.data['valor']
    memory = formulario.data['qtdmemory']
    qtddisco = formulario.data['qtddiscos']
    discos = formulario.data['disco']
    q = formulario.data['quantidade']
    i = formulario.data['numinterfaces']
    p = formulario.data['pool']
    c = formulario.data['componente']
    if not q:
            q = 0
    if not memory:
            memory = 0
    if not qtddisco:
            qtddisco = 0   
    
    mitem= tipo.objects.get(id= int(m))
    novoitem = item(tipoitem = mitem, valor = float(v), quantidade = q, numinterfaces = i,  qtdmemory = memory, disco= discos, qtddiscos = qtddisco, itemprojeto = meuprojeto, pool = p, componente = c)
    novoitem.save()
    listadeitem = item.objects.filter(itemprojeto = meuprojeto)
    contexto = calctotal(request, listadeitem)
    contexto['itens'] = listadeitem
    contexto['projeto'] = meuprojeto
    contexto['formulario'] = formulario
    
    
    
    return contexto
    
    
    
@never_cache    
@csrf_exempt
def verprojeto(request):
    
    updateprojeto()    
    idprojeto = request.GET['id']
    formulario = FormServer()
    contexto = Context()
    if request.method == "POST":
        formulario = FormServer(request.POST, request.FILES)
        contexto['formulario'] = formulario
        if formulario.is_valid():
            contexto = Context()
            contexto = inserir_item_proj(request)
            return HttpResponseRedirect("/verprojeto?id="+idprojeto)
        
            
    
    meuprojeto = projeto.objects.get(id=idprojeto)
    serverlist = item.objects.filter(itemprojeto = idprojeto)
    contexto = calctotal(request, serverlist)
    contexto['formulario'] = formulario
    contexto['itens'] = serverlist
    contexto['projeto'] = meuprojeto
    
    return render(request,"verprojeto.html", contexto)


@csrf_exempt
def allcsv(request):
    
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="Custo_de_Projetos.csv"'
    projetos = projeto.objects.all()
    
        
    writer = csv.writer(response)
    
    writer.writerow(['sep=,'])
    writer.writerow(['Projeto', 'Equipamento' ,'Componente', 'Pool', 'Custo mensal por Equipamento' ,'Quantidade de Equipamentos' ,"Qtde Interfaces",   'Valor Equipamento', " Qtde Memoria GB", " Qtde Discos "," Tipo de Discos ",'Cubagem total',  "Custo Mensal", "Custo Equipamentos","Custo Anual"  ])
    
    for p in projetos:
        serversproj = item.objects.filter(itemprojeto = p)
        calctotal(request,serversproj)
        for s in serversproj:
            gastoanual = s.getcustomensal() *12
            writer.writerow([p.nome , s.tipoitem, s.componente, s.pool, ( "%.2f" % s.getcustomensalitem()), s.quantidade, s.numinterfaces, s.valor, s.qtdmemory, s.qtddiscos, s.disco,  (s.tipoitem.altura * s.quantidade) ,  ( "%.2f" % s.getcustomensal()),( "%.2f" % s.getcustoequipamentos()), ( "%.2f" %  gastoanual )])
       
    return response


@csrf_exempt    
def createcsv(request):
    idprojeto = request.GET['id']
    response = HttpResponse(content_type='text/csv')
    
    myprojeto = projeto.objects.get(id = idprojeto)
    response['Content-Disposition'] = 'attachment; filename="'+myprojeto.nome+'".csv"'
    serversproj = item.objects.filter(itemprojeto = myprojeto)
    contexto = calctotal(request, serversproj)
    
    
    
    writer = csv.writer(response)
    
    writer.writerow(['sep=,'])
    writer.writerow(['Projeto', 'Equipamento' , 'Componente','Pool', 'Custo mensal por Equipamento' ,'Quantidade de Equipamentos' ,"Qtde Interfaces",   'Valor Equipamento', " Qtde Memoria GB", " Qtde Discos "," Tipo de Discos ",'Cubagem total',  "Custo Mensal","Custo Equipamentos",  "Custo Anual"  ])
    
    
    serversproj = item.objects.filter(itemprojeto = myprojeto)
    calctotal(request,serversproj)
    for s in serversproj:
        gastoanual = s.getcustomensal() *12
        writer.writerow([myprojeto.nome , s.tipoitem, s.componente, s.pool, ( "%.2f" % s.getcustomensalitem()), s.quantidade, s.numinterfaces, s.valor, s.qtdmemory, s.qtddiscos, s.disco,  (s.tipoitem.altura * s.quantidade) ,  ( "%.2f" % s.getcustomensal()),( "%.2f" % s.getcustoequipamentos()), ( "%.2f" %  gastoanual )])
    writer.writerow(["TOTAL" , "--------","--------","--------", ( "%.2f" % contexto['CustoMensalTotal']),  contexto['QuantidadeTotal'] ,  contexto['TotalInterfaces'] , ( "%.2f" % contexto['TotalEquipamentos']), contexto['MemoriaTotal'], contexto['TotalDiscos'],"--------" ,  contexto['CubagemTotal'] , ( "%.2f" % contexto['CustoMensalTotal']),( "%.2f" % contexto['TotalEquipamentos']),  ( "%.2f" % contexto['CustoAnualTotal'])])
    return response
          
@csrf_exempt
def resetlist(request):
    
    
    request.session.modified = True            
    formulario = FormServer()
    del request.session['lista']
     
      
    return render_to_response("index.html", {'formulario': formulario})


@never_cache
@csrf_exempt            
def equipamentos(request):
    contexto = Context()
    Myform = FormTipo()
    if request.method == "POST":
        Myform = FormTipo(request.POST, request.FILES)
        if Myform.is_valid():
            contexto = inserir_equipamento(request)
            return HttpResponseRedirect("/equipamentos")
        
    equipamentos = tipo.objects.all() 
    contexto['equipamentos'] = equipamentos
    contexto['formulario'] = Myform
    return render_to_response("equipamentos.html",contexto)


@csrf_exempt
def removetipo(request):
    
    id_item = request.GET['id']
    t = tipo.objects.filter(id=id_item)
    t.delete()
    
    equipamentos = tipo.objects.all()
    formulario = FormTipo()
    return render_to_response("equipamentos.html",{ "formulario": formulario , "itens": equipamentos })

def removeprojeto(request):
    
    if request.is_ajax():
        
        id_projeto = request.GET['id']
        p = projeto.objects.filter(id=id_projeto)
        listadeitem = item.objects.filter(itemprojeto = projeto)
        for l in listadeitem:
            l.delete()
    
        p.delete()
            
        projetos = projeto.objects.all()
        contexto = Context()
        contexto['projetos'] = projetos
    
    
    
    return render_to_response('projetos.html', contexto, context_instance=RequestContext(request))

@csrf_exempt
def inserir_equipamento(request):
    contexto = Context()
    Myform = FormTipo(request.POST, request.FILES)
    Myform.save()          
    equipamentos = tipo.objects.all()
    contexto['formulario'] = Myform
    contexto['equipamentos'] = equipamentos
    
    return contexto
@csrf_exempt
def updateitem(request):
    
    if request.is_ajax():
        idprojeto = request.GET['idprojeto']
        iditem = request.GET['id']
        qtde = request.GET['quantidade']
        memoria = request.GET['qtdmemory']
        tdisco = request.GET['disco']
        qtdiscos = request.GET['qtddiscos']
        valoritem = request.GET['valor']
        interfaces = request.GET['interfaces']
        npool = request.GET['pool']
        ncomponente = request.GET['componente']
        
        item.objects.filter(id=iditem).update( quantidade = qtde, valor = valoritem, numinterfaces = interfaces, disco = tdisco, qtdmemory = memoria , qtddiscos = qtdiscos, pool = npool, componente = ncomponente )
        updateprojeto()
        Listadeitem= item.objects.filter(itemprojeto = idprojeto)  
        
        
        contexto = calctotal(request, Listadeitem)
        contexto['projeto'] = projeto.objects.get(id=idprojeto)
        contexto['itens'] = Listadeitem
       
        return render_to_response('vprojeto.html', contexto, context_instance=RequestContext(request))
@csrf_exempt
def removeitemproj(request):
    
    if request.is_ajax():
        iditem = request.GET['id']
        i = item.objects.get(id=iditem)
        meuprojeto = projeto.objects.get(id=i.itemprojeto.id)
        idprojeto = meuprojeto.id
        i.delete()
        
        updateprojeto()
        
        Listadeitem= item.objects.filter(itemprojeto = idprojeto)  
        
        
        contexto = calctotal(request, Listadeitem)
        contexto['projeto'] = projeto.objects.get(id=idprojeto)
        contexto['itens'] = Listadeitem
       
    return render_to_response('vprojeto.html', contexto, context_instance=RequestContext(request))    
@csrf_exempt
def updatetipo(request):
    

    
    if request.is_ajax():
        idtipo = request.GET['idtipo']
        descricao = request.GET['descricao']
        altura = request.GET['altura']
        consumo = request.GET['consumo']
        altura = altura.replace(',','.')
        tipo.objects.filter(id=idtipo).update( descricao = descricao, altura = altura, consumo = consumo)
        equipamentos = tipo.objects.all()  
        contexto = Context()
        contexto['equipamentos'] = equipamentos
    
        return render_to_response('equipamentos.html', contexto, context_instance=RequestContext(request))
    